/* Copyright 2001,2002,2003 NAH6
 * All Rights Reserved
 *
 * Parts Copyright DoD, Parts Copyright Starium
 *
 */
          /*LINTLIBRARY*/
          /*PROTOLIB1*/
#include <math.h>
#include "main.h"
#include "bwexp.h"

/**************************************************************************
*
* ROUTINE
*		BWExpand
*
* FUNCTION
*		Bandwidth expansion of LPC predictor coefficients
*
* SYNOPSIS
*		BWExpand(alpha, pc, pcexp)     
*
*   formal 
*                       data    I/O
*       name            type    type    function
*       -------------------------------------------------------------------
*	alpha		float	i	Bandwidth expansion factor
*	pc		float	i	predictor coefficients
*	pcexp		float	o	expanded predictor coefficients
***************************************************************************
*	
* DESCRIPTION
*
*  	Subroutine to perform bandwidth modification by moving the poles
*	(or zeros) radially in the z plane.  If the bandwidth expansion
*	factor (alpha) is less than unity, the bandwidths are expanded by
*	shifting the poles (or zeros) toward the origin of the z plane.
*	The predictor coefficients are scaled directly according to:
*
*		              i-1
*		a' = a  alpha		where i = 1, . . . , order+1
*		 i    i
*
*	Resulting in a bandwidth expansion of:
*
*		-(fs/pi)ln(alpha) Hz
*
*	(e.g., fs = 8 kHz, alpha = 0.994127 -> 15 Hz bandwidth expansion)
*
*	CELP's LPC predictor coefficient convention is:
*              p+1         -(i-1)
*       A(z) = SUM   a   z          where a  = +1.0
*              i=1    i                    1
*
***************************************************************************
*
* CALLED BY
*
*	FindAdaptResidual FindImpulseResponse PostFilter
*	FindLPCResidual UpdateEverything LPC_Analysis
*
**************************************************************************/
void BWExpand(
float 	alpha, 
float	pc[ORDER+1], 
float	pcexp[ORDER+1])
{
  int i;

  pcexp[0] = pc[0];

  for (i = 1; i <= ORDER; i++)
    pcexp[i] = pc[i]*(float)pow((double)(alpha),(double)(i));
}
